#include <iostream>
using namespace std;

// void myprintf()
// {
//     std::cout << std::endl;
// }

// // C++11引入左值引用和右值引用，
// // 为了让函数模版能够接收这两种引用类型的参数, 又引入了万能引用
// // 万能引用配合完美转发可以保证传入参数的引用类型在不断递归的过程中能够一直保持最开始的引用状态
// template <typename T, typename ...Args>
// void myprintf(const T& v, Args &&...args)
// {
//     std::cout << v;
//     // 注意
//     // 1. C++11规定要给args打上括号，但是又不能给 ... 打上括号
//     // 2. 虽然只要  Args &&...args 这个参数为空，就会直接执行else中的代码
//     //    但是编译器会默认检查 myprintf中这个参数为空的情况是否能继续执行
//     //    那么此时就需要为 myprintf 专门设计一个特化实现，即专门实现 myprintf()
//     if((sizeof ...(args)) > 0)
//     {
//         myprintf(std::forward<Args>(args)...);
//     }
//     else
//     {
//         std::cout << std::endl;
//     }
// }

// int main()
// {
//     myprintf("比特就业课");
//     myprintf("111期 ", "比特就业课 ", 666);

//     return 0;
// }


void myprintf()
{
    std::cout << std::endl;
}

template <typename T, typename ...Args>
void myprintf(const T& v, Args &&...args)
{
    std::cout << v << " ";
    myprintf(std::forward<Args>(args)...);
}

int main()
{
    myprintf("一条消息");
    myprintf("我的 ", "一条消息", 888);
}

